﻿using UnityEngine;
using System.Collections;
using Assets.components.abstracts;
using Assets.components;
using Assets.entities;

namespace Assets.components {

    public class VoxelMarchingGeometryDrawer : VoxelGeometryDrawer {

        #region staticLookupTables
        private static int[,] squareTrianglesTable = new int[16, 10] {
            {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {6, 7, 5, -1, -1, -1, -1, -1, -1, -1},
            {4, 5, 3, -1, -1, -1, -1, -1, -1, -1},
            {6, 7, 4, 4, 7, 3, -1, -1, -1, -1},
            {3, 1, 2, -1, -1, -1, -1, -1, -1, -1},
            {3, 1, 2, 6, 7, 5, -1, -1, -1, -1},
            {5, 1, 4, 4, 1, 2, -1, -1, -1, -1},
            {6, 7, 4, 4, 7, 1, 4, 1, 2, -1},
            {7, 0, 1, -1, -1, -1, -1, -1, -1, -1},
            {6, 0, 1, 6, 1, 5, -1, -1, -1, -1},
            {7, 0, 1, 4, 5, 3, -1, -1, -1, -1},
            {6, 0, 1, 6, 1, 3, 6, 3, 4, -1},
            {7, 0, 2, 7, 2, 3, -1, -1, -1, -1},
            {6, 0, 5, 0, 3, 5, 0, 2, 3, -1},
            {7, 0, 2, 7, 2, 5, 5, 2, 4, -1},
            {6, 0, 2, 6, 2, 4, -1, -1, -1, -1}
        };



        private static int[] cubeEdgeTable = new int[256] {
			0x0, 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c,
			0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,
			0x190, 0x99, 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c,
			0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,
			0x230, 0x339, 0x33, 0x13a, 0x636, 0x73f, 0x435, 0x53c,
			0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,
			0x3a0, 0x2a9, 0x1a3, 0xaa, 0x7a6, 0x6af, 0x5a5, 0x4ac,
			0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,
			0x460, 0x569, 0x663, 0x76a, 0x66, 0x16f, 0x265, 0x36c,
			0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,
			0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff, 0x3f5, 0x2fc,
			0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,
			0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55, 0x15c,
			0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,
			0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc,
			0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,
			0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc,
			0xcc, 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,
			0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c,
			0x15c, 0x55, 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,
			0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc,
			0x2fc, 0x3f5, 0xff, 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,
			0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c,
			0x36c, 0x265, 0x16f, 0x66, 0x76a, 0x663, 0x569, 0x460,
			0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac,
			0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa, 0x1a3, 0x2a9, 0x3a0,
			0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c,
			0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33, 0x339, 0x230,
			0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c,
			0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99, 0x190,
			0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c,
			0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0
		};
        private static int[,] cubeTrianglesTable = new int[256,16] {
            {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1},
            {3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1},
            {3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1},
            {3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1},
            {9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1},
            {1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1},
            {9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1},
            {2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1},
            {8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1},
            {9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1},
            {4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1},
            {3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1},
            {1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1},
            {4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1},
            {4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1},
            {9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1},
            {1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1},
            {5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1},
            {2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1},
            {9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1},
            {0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1},
            {2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1},
            {10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1},
            {4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1},
            {5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1},
            {5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1},
            {9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1},
            {0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1},
            {1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1},
            {10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1},
            {8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1},
            {2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1},
            {7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1},
            {9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1},
            {2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1},
            {11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1},
            {9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1},
            {5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1},
            {11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1},
            {11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1},
            {1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1},
            {9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1},
            {5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1},
            {2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1},
            {0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1},
            {5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1},
            {6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1},
            {0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1},
            {3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1},
            {6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1},
            {5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1},
            {1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1},
            {10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1},
            {6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1},
            {1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1},
            {8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1},
            {7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1},
            {3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1},
            {5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1},
            {0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1},
            {9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1},
            {8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1},
            {5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1},
            {0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1},
            {6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1},
            {10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1},
            {10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1},
            {8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1},
            {1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1},
            {3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1},
            {0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1},
            {10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1},
            {0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1},
            {3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1},
            {6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1},
            {9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1},
            {8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1},
            {3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1},
            {6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1},
            {0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1},
            {10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1},
            {10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1},
            {1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1},
            {2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1},
            {7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1},
            {7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1},
            {2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1},
            {1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1},
            {11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1},
            {8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1},
            {0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1},
            {7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1},
            {10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1},
            {2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1},
            {6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1},
            {7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1},
            {2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1},
            {1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1},
            {10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1},
            {10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1},
            {0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1},
            {7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1},
            {6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1},
            {8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1},
            {9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1},
            {6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1},
            {1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1},
            {4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1},
            {10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1},
            {8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1},
            {0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1},
            {1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1},
            {8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1},
            {10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1},
            {4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1},
            {10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1},
            {5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1},
            {11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1},
            {9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1},
            {6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1},
            {7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1},
            {3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1},
            {7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1},
            {9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1},
            {3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1},
            {6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1},
            {9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1},
            {1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1},
            {4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1},
            {7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1},
            {6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1},
            {3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1},
            {0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1},
            {6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1},
            {1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1},
            {0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1},
            {11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1},
            {6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1},
            {5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1},
            {9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1},
            {1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1},
            {1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1},
            {10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1},
            {0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1},
            {5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1},
            {10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1},
            {11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1},
            {0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1},
            {9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1},
            {7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1},
            {2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1},
            {8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1},
            {9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1},
            {9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1},
            {1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1},
            {9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1},
            {9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1},
            {5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1},
            {0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1},
            {10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1},
            {2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1},
            {0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1},
            {0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1},
            {9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1},
            {5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1},
            {3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1},
            {5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1},
            {8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1},
            {0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1},
            {9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1},
            {0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1},
            {1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1},
            {3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1},
            {4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1},
            {9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1},
            {11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1},
            {11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1},
            {2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1},
            {9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1},
            {3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1},
            {1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1},
            {4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1},
            {4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1},
            {0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1},
            {3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1},
            {3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1},
            {0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1},
            {9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1},
            {1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
            {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}
        };
        #endregion



        public override void draw(Voxel voxel, VoxelWorldChunk chunk, VoxelWorld world, int x, int y, int z, VoxelMeshData meshData) {
            Voxel topVoxel = world.getVoxelAt(chunk.originX + x, chunk.originY + y + 1, chunk.originZ + z);
            Voxel bottomVoxel = world.getVoxelAt(chunk.originX + x, chunk.originY + y - 1, chunk.originZ + z);
            Voxel backVoxel = world.getVoxelAt(chunk.originX + x, chunk.originY + y, chunk.originZ + z + 1);
            Voxel frontVoxel = world.getVoxelAt(chunk.originX + x, chunk.originY + y, chunk.originZ + z - 1);
            Voxel rightVoxel = world.getVoxelAt(chunk.originX + x + 1, chunk.originY + y, chunk.originZ + z);
            Voxel leftVoxel = world.getVoxelAt(chunk.originX + x - 1, chunk.originY + y, chunk.originZ + z);
            MarchingCube cube = voxel.content.cube;
            bool isSolid = voxel.prototype.solid;
            bool isIsosurface = cube.isIsosurface;

            //ciascuna faccia viene disegnata se non è presente un voxel adiacente
            //oppure se è presente (con una solidità differente da quella del voxel
            //da disegnare) e trasparente.

            float cx = (float)x;
            float cy = (float)y;
            float cz = (float)z;

            //disegna solo i triangolini e non le facce, solo se è un voxel da smussare
            if (isIsosurface) {
                this.marchCube(voxel, meshData, cx, cy, cz);
            }



            if (topVoxel == null || topVoxel.content.cube.isIsosurface) {
                this.drawTopFace(voxel, meshData, cx, cy, cz);
            } else {
                if (topVoxel.prototype.solid != isSolid) {
                    if (topVoxel.prototype.solid == false) {
                        this.drawTopFace(voxel, meshData, cx, cy, cz);
                    }
                }
            }



            if (bottomVoxel == null) {
                this.drawBottomFace(voxel, meshData, cx, cy, cz);
            } else {
                if (bottomVoxel.prototype.solid != isSolid) {
                    if (bottomVoxel.prototype.solid == false) {
                        this.drawBottomFace(voxel, meshData, cx, cy, cz);
                    }
                }
            }



            if (backVoxel == null) {
                this.drawBackFace(voxel, meshData, cx, cy, cz);
            } else {
                if (backVoxel.prototype.solid != isSolid) {
                    if (backVoxel.prototype.solid == false) {
                        this.drawBackFace(voxel, meshData, cx, cy, cz);
                    }
                }
            }

            

            if (frontVoxel == null) {
                this.drawFrontFace(voxel, meshData, cx, cy, cz);
            } else {
                if (frontVoxel.prototype.solid != isSolid) {
                    if (frontVoxel.prototype.solid == false) {
                        this.drawFrontFace(voxel, meshData, cx, cy, cz);
                    }
                }
            }
            
            

            if (rightVoxel == null) {
                this.drawRightFace(voxel, meshData, cx, cy, cz);
            } else {
                if (rightVoxel.prototype.solid != isSolid) {
                    if (rightVoxel.prototype.solid == false) {
                        this.drawRightFace(voxel, meshData, cx, cy, cz);
                    }
                }
            }
            


            if (leftVoxel == null) {
                this.drawLeftFace(voxel, meshData, cx, cy, cz);
            } else {
                if (leftVoxel.prototype.solid != isSolid) {
                    if (leftVoxel.prototype.solid == false) {
                        this.drawLeftFace(voxel, meshData, cx, cy, cz);
                    }
                }
            }
        }



        private void drawTopFace(Voxel voxel, VoxelMeshData data, float x, float y, float z) {
            MarchingSquare square = voxel.content.cube.topMarchingSquare;
            Vector3 p1 = new Vector3(x - 0.5f, y + 0.5f, z + 0.5f);
            Vector3 p2 = new Vector3(x + 0.5f, y + 0.5f, z + 0.5f);
            Vector3 p3 = new Vector3(x + 0.5f, y + 0.5f, z - 0.5f);
            Vector3 p4 = new Vector3(x - 0.5f, y + 0.5f, z - 0.5f);
            Vector2 t0 = new Vector2(0, 0.75f);
            float texSize = 0.25f;

            this.marchSquare(voxel, data, square, p1, p2, p3, p4, t0, texSize);
        }



        private void drawRightFace(Voxel voxel, VoxelMeshData data, float x, float y, float z) {
            MarchingSquare square = voxel.content.cube.rightMarchingSquare;
            Vector3 p1 = new Vector3(x + 0.5f, y + 0.5f, z - 0.5f);
            Vector3 p2 = new Vector3(x + 0.5f, y + 0.5f, z + 0.5f);
            Vector3 p3 = new Vector3(x + 0.5f, y - 0.5f, z + 0.5f);
            Vector3 p4 = new Vector3(x + 0.5f, y - 0.5f, z - 0.5f);
            Vector2 t0 = new Vector2(0.5f, 0.75f);
            float texSize = 0.25f;

            this.marchSquare(voxel, data, square, p1, p2, p3, p4, t0, texSize);
        }



        private void drawLeftFace(Voxel voxel, VoxelMeshData data, float x, float y, float z) {
            MarchingSquare square = voxel.content.cube.leftMarchingSquare;
            Vector3 p1 = new Vector3(x - 0.5f, y + 0.5f, z + 0.5f);
            Vector3 p2 = new Vector3(x - 0.5f, y + 0.5f, z - 0.5f);
            Vector3 p3 = new Vector3(x - 0.5f, y - 0.5f, z - 0.5f);
            Vector3 p4 = new Vector3(x - 0.5f, y - 0.5f, z + 0.5f);
            Vector2 t0 = new Vector2(0, 0.5f);
            float texSize = 0.25f;

            this.marchSquare(voxel, data, square, p1, p2, p3, p4, t0, texSize);
        }



        private void drawFrontFace(Voxel voxel, VoxelMeshData data, float x, float y, float z) {
            MarchingSquare square = voxel.content.cube.frontMarchingSquare;
            Vector3 p1 = new Vector3(x - 0.5f, y + 0.5f, z - 0.5f);
            Vector3 p2 = new Vector3(x + 0.5f, y + 0.5f, z - 0.5f);
            Vector3 p3 = new Vector3(x + 0.5f, y - 0.5f, z - 0.5f);
            Vector3 p4 = new Vector3(x - 0.5f, y - 0.5f, z - 0.5f);
            Vector2 t0 = new Vector2(0.75f, 0.75f);
            float texSize = 0.25f;

            this.marchSquare(voxel, data, square, p1, p2, p3, p4, t0, texSize);
        }



        private void drawBackFace(Voxel voxel, VoxelMeshData data, float x, float y, float z) {
            MarchingSquare square = voxel.content.cube.backMarchingSquare;
            Vector3 p1 = new Vector3(x + 0.5f, y + 0.5f, z + 0.5f);
            Vector3 p2 = new Vector3(x - 0.5f, y + 0.5f, z + 0.5f);
            Vector3 p3 = new Vector3(x - 0.5f, y - 0.5f, z + 0.5f);
            Vector3 p4 = new Vector3(x + 0.5f, y - 0.5f, z + 0.5f);
            Vector2 t0 = new Vector2(0.25f, 0.5f);
            float texSize = 0.25f;

            this.marchSquare(voxel, data, square, p1, p2, p3, p4, t0, texSize);
        }



        private void drawBottomFace(Voxel voxel, VoxelMeshData data, float x, float y, float z) {
            MarchingSquare square = voxel.content.cube.bottomMarchingSquare;
            Vector3 p1 = new Vector3(x - 0.5f, y - 0.5f, z - 0.5f);
            Vector3 p2 = new Vector3(x + 0.5f, y - 0.5f, z - 0.5f);
            Vector3 p3 = new Vector3(x + 0.5f, y - 0.5f, z + 0.5f);
            Vector3 p4 = new Vector3(x - 0.5f, y - 0.5f, z + 0.5f);
            Vector2 t0 = new Vector2(0.25f, 0.75f);
            float texSize = 0.25f;

            this.marchSquare(voxel, data, square, p1, p2, p3, p4, t0, texSize);
        }



        private void marchSquare(Voxel voxel, VoxelMeshData data, MarchingSquare square, 
            Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4, Vector2 texOrigin, float texSize){

            Vector2[] uvlist = new Vector2[8];
            Vector3[] vertlist = new Vector3[8];
            byte squareIndex = square.type;

            //array dei possibili vertici coinvolti nei triangoli di un marching square
            vertlist[0] = p1;
            vertlist[1] = this.interpolateVertex(p1, p2, square.topLeftBit, square.topRightBit);
            vertlist[2] = p2;
            vertlist[3] = this.interpolateVertex(p2, p3, square.topRightBit, square.bottomRightBit);
            vertlist[4] = p3;
            vertlist[5] = this.interpolateVertex(p3, p4, square.bottomRightBit, square.bottomLeftBit);
            vertlist[6] = p4;
            vertlist[7] = this.interpolateVertex(p4, p1, square.bottomLeftBit, square.topLeftBit);

            //array delle coordinate uv dei possibili vertici dei triangoli di un marching square
            float halfSize = texSize/2f;
            uvlist[0] = texOrigin + new Vector2(0, texSize);
            uvlist[1] = texOrigin + new Vector2(halfSize, texSize);
            uvlist[2] = texOrigin + new Vector2(texSize, texSize);
            uvlist[3] = texOrigin + new Vector2(texSize, halfSize);
            uvlist[4] = texOrigin + new Vector2(texSize, 0);
            uvlist[5] = texOrigin + new Vector2(halfSize, 0);
            uvlist[6] = texOrigin;
            uvlist[7] = texOrigin + new Vector2(0, halfSize);

            //aggiungo i triangoli alla mesh
            for (int i = 0; squareTrianglesTable[squareIndex, i] != -1; i += 3) {
                int index = data.vertexCount;

                int firstIndex = squareTrianglesTable[squareIndex, i];
                int secondIndex = squareTrianglesTable[squareIndex, i + 1];
                int thirdIndex = squareTrianglesTable[squareIndex, i + 2];
                
                data.addVertex(vertlist[firstIndex]);
                data.addVertex(vertlist[secondIndex]);
                data.addVertex(vertlist[thirdIndex]);
                data.addUV(uvlist[firstIndex]);
                data.addUV(uvlist[secondIndex]);
                data.addUV(uvlist[thirdIndex]);
                data.addTriangle(voxel.prototype.subMaterialIndex, index, index + 1, index + 2);
            }
        }



        private void marchCube(Voxel voxel, VoxelMeshData data, float x, float y, float z) {
            MarchingCube cube = voxel.content.cube;
            Vector3[] positions = new Vector3[8];
            bool[] corners = new bool[8];
            byte cubeIndex = cube.type;

            if (cubeIndex != 0 && cubeIndex != 255) {
                //punti di controllo
                corners[0] = cube.topBackLeftBit;
                corners[1] = cube.topBackRightBit;
                corners[2] = cube.topFrontRightBit;
                corners[3] = cube.topFrontLeftBit;
                corners[4] = cube.bottomBackLeftBit;
                corners[5] = cube.bottomBackRightBit;
                corners[6] = cube.bottomFrontRightBit;
                corners[7] = cube.bottomFrontLeftBit;

                //posizioni associate ai punti di controllo
                positions[0] = new Vector3(x - 0.5f, y + 0.5f, z + 0.5f);
                positions[1] = new Vector3(x + 0.5f, y + 0.5f, z + 0.5f);
                positions[2] = new Vector3(x + 0.5f, y + 0.5f, z - 0.5f);
                positions[3] = new Vector3(x - 0.5f, y + 0.5f, z - 0.5f);
                positions[4] = new Vector3(x - 0.5f, y - 0.5f, z + 0.5f);
                positions[5] = new Vector3(x + 0.5f, y - 0.5f, z + 0.5f);
                positions[6] = new Vector3(x + 0.5f, y - 0.5f, z - 0.5f);
                positions[7] = new Vector3(x - 0.5f, y - 0.5f, z - 0.5f);

                //prelevo la bitmask dei vertici
                Vector3[] vertlist = new Vector3[12];
                BitArray edgeMask = this.getBitMask(cubeEdgeTable[cubeIndex]);

                //interpolazione dei punti di controllo connessi da un bordo
                if (edgeMask.Get(0))
                    vertlist[0] = this.interpolateVertex(positions[0], positions[1], corners[0], corners[1]);
                if (edgeMask.Get(1))
                    vertlist[1] = this.interpolateVertex(positions[1], positions[2], corners[1], corners[2]);
                if (edgeMask.Get(2))
                    vertlist[2] = this.interpolateVertex(positions[2], positions[3], corners[2], corners[3]);
                if (edgeMask.Get(3))
                    vertlist[3] = this.interpolateVertex(positions[3], positions[0], corners[3], corners[0]);
                if (edgeMask.Get(4))
                    vertlist[4] = this.interpolateVertex(positions[4], positions[5], corners[4], corners[5]);
                if (edgeMask.Get(5))
                    vertlist[5] = this.interpolateVertex(positions[5], positions[6], corners[5], corners[6]);
                if (edgeMask.Get(6))
                    vertlist[6] = this.interpolateVertex(positions[6], positions[7], corners[6], corners[7]);
                if (edgeMask.Get(7))
                    vertlist[7] = this.interpolateVertex(positions[7], positions[4], corners[7], corners[4]);
                if (edgeMask.Get(8))
                    vertlist[8] = this.interpolateVertex(positions[0], positions[4], corners[0], corners[4]);
                if (edgeMask.Get(9))
                    vertlist[9] = this.interpolateVertex(positions[1], positions[5], corners[1], corners[5]);
                if (edgeMask.Get(10))
                    vertlist[10] = this.interpolateVertex(positions[2], positions[6], corners[2], corners[6]);
                if (edgeMask.Get(11))
                    vertlist[11] = this.interpolateVertex(positions[3], positions[7], corners[3], corners[7]);

                //aggiungo i triangoli alla mesh
                for (int i = 0; cubeTrianglesTable[cubeIndex, i] != -1; i += 3) {
                    int index = data.vertexCount;

                    float tec = 0.25f;
                    Vector3 firstVertex = vertlist[cubeTrianglesTable[cubeIndex, i]];
                    Vector3 secondVertex = vertlist[cubeTrianglesTable[cubeIndex, i + 1]];
                    Vector3 thirdVertex = vertlist[cubeTrianglesTable[cubeIndex, i + 2]];
                    Vector2 firstUv = new Vector2(0f, 0.75f);
                    Vector2 secondUv = new Vector2(0f, 1.0f);
                    Vector2 thirdUv = new Vector2(0.25f, 0.75f);

                    data.addVertex(firstVertex);
                    data.addVertex(secondVertex);
                    data.addVertex(thirdVertex);
                    data.addUV(firstUv);
                    data.addUV(secondUv);
                    data.addUV(thirdUv);
                    data.addTriangle(voxel.prototype.subMaterialIndex, index, index + 1, index + 2);
                }

            } 
        }



        private BitArray getBitMask(int value){
            BitArray binary = new BitArray(new int[]{value});
            bool[] bits = new bool[binary.Count];
            binary.CopyTo(bits, 0);
            return binary;
        }



        private Vector3 interpolateVertex(Vector3 p1, Vector3 p2, bool valp1, bool valp2) {
            float pivot;

            if (valp1 != valp2) {
                pivot = 0.5f;
            } else {
                pivot = 1.0f;
            }

            float x = Mathf.Lerp(p1.x, p2.x, pivot);
            float y = Mathf.Lerp(p1.y, p2.y, pivot);
            float z = Mathf.Lerp(p1.z, p2.z, pivot);
            return new Vector3(x, y, z);
        }
    }

}